% 圆周卷积函数
%输出参数：圆周卷积结果 y %输入参数 ：需要计算岡周卷积的序列 x l , x2 和岡周卷积的点数 N
function yc=circonv( xl ,x2 ,N ) 
    % 判断两个序列的长度是否小于 N
    if length( xl )>N
        error( 'N must not be less than length of xl');
    end
    if length(x2 )>N
        error( 'N must not be less than length of x2') ;
    end

    % 补零知道序列达到卷积所需长度
    xl =[xl ,zeros(1,N- length(xl ) )]; 
    x2=[x2 ,zeros(1,N- length( x2 ) )];
    n=0:1:N-1;

    % 序列翻褶
    x2= x2 ( mod(- n,N )+1);
    H =zeros( N,N);
    % 移位卷积
    for n=1:1:N 
       H( n,:)=cirshiftd( x2 ,n-1,N);
    end
    %计算循环卷积
    yc= xl * H' ; 

    % 圆周移位
    function y=cirshiftd( x ,m , N) 
        % N:circular length
        % y：output shifted sequence
        if length(x)>N
            error( 'the length of x must be less than N')
        end
        x=[x, zeros(1,N- length ( x))];
        n =0:1:N-1;
        y=x( mod( n- m,N )+1);
    